package com.huanling.main.keyconflictdealer;

import com.huanling.main.dataflow.DataDeal;

import java.util.Map;
import java.util.Objects;
import java.util.function.BiFunction;

/**
 * key 冲突抽象类
 *
 * @author guibo.sun
 * @since 16 七月 2021
 */
public abstract class AbstractConflictKeyDealer {

    /**
     * 保护，不允许重写
     *
     * @param newValue 相同key的新值
     * @param dataDeal 处理类
     * @return 返回处理同key的新旧值的处理逻辑Function
     * @see java.util.Map#compute(java.lang.Object, java.util.function.BiFunction)
     */
    public final BiFunction<String, Map<String, Object>, Map<String, Object>> getDealer(Map<String, Object> newValue, DataDeal dataDeal) {

        return (key, oldValue) -> {
            if (Objects.nonNull(oldValue)) {
                this.preDeal(dataDeal.getConflictKeyContext(), key, oldValue, newValue);
                return this.getRemappingResult(key, oldValue, newValue);
            } else {
                return newValue;
            }
        };
    }

    /**
     * 根据旧值和新值，给出处理后的值 类似merge
     *
     * @param key      键值
     * @param oldValue 旧值
     * @param newValue 新值
     * @return merge后的值
     */
    protected Map<String, Object> getRemappingResult(String key, Map<String, Object> oldValue, Map<String, Object> newValue) {
        return newValue;
    }

    /**
     * 确认key冲突，冲突前处理
     * 可以抛出不受检异常以强制中断程序（建议抛出异常时加入描述）
     *
     * @param conflictKeyContext 上下文
     * @param key                键
     * @param oldValue           旧值
     * @param newValue           新值
     */
    void preDeal(ConflictKeyContext conflictKeyContext, String key, Map<String, Object> oldValue, Map<String, Object> newValue) {
    }
}
